import re


def is_id_number(id_number):
    if len(id_number) != 18 and len(id_number) != 15:
        print('身份证号码长度错误')
        return False
    regularExpression = "(^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|" \
                        "(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}$)"
    # 假设18位身份证号码:41000119910101123X  410001 19910101 123X
    # ^开头
    # [1-9] 第一位1-9中的一个      4
    # \\d{5} 五位数字           10001（前六位省市县地区）
    # (18|19|20)                19（现阶段可能取值范围18xx-20xx年）
    # \\d{2}                    91（年份）
    # ((0[1-9])|(10|11|12))     01（月份）
    # (([0-2][1-9])|10|20|30|31)01（日期）
    # \\d{3} 三位数字            123（第十七位奇数代表男，偶数代表女）
    # [0-9Xx] 0123456789Xx其中的一个 X（第十八位为校验值）
    # $结尾

    # 假设15位身份证号码:410001910101123  410001 910101 123
    # ^开头
    # [1-9] 第一位1-9中的一个      4
    # \\d{5} 五位数字           10001（前六位省市县地区）
    # \\d{2}                    91（年份）
    # ((0[1-9])|(10|11|12))     01（月份）
    # (([0-2][1-9])|10|20|30|31)01（日期）
    # \\d{3} 三位数字            123（第十五位奇数代表男，偶数代表女），15位身份证不含X
    # $结尾
    if re.match(regularExpression, id_number):
        if len(id_number) == 18:
            n = id_number.upper()
            # 前十七位加权因子
            var = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
            # 这是除以11后，可能产生的11位余数对应的验证码
            var_id = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']

            sum = 0
            for i in range(0, 17):
                sum += int(n[i]) * var[i]
            sum %= 11
            if (var_id[sum]) != str(n[17]):
                print("身份证号规则核验失败，校验码应为", var_id[sum], "，当前校验码是：", n[17])
                return False
        return True
    else:
        return False


if __name__ == '__main__':
    result = is_id_number('41000119900101007x')
    print(result)
